# python打印内容
# print('徐传良')

# 直接运行python文件，在文件目录中使用puthon xxx.py

# 读取控制台输入
# i = input()
# print(i)

# python语法采用缩进方式，当语句以:结尾时，缩进的语句视为语句块
# a = 100
# if a>= 0:
#     print(a)
# else:
#     print(-a)

# 字符串使用单引号/双引号表示，\表示转义

# python中使用True、Flase表示布尔值，布尔值可以使用and、or、not运算
# python中使用None表示空值，
# python中变量可以反复赋值

# python使用ord()函数获取字符的整数表示，chr()函数把编码转换对应的字符
# print(ord('A'))
# print(ord('中'))
# print(chr(ord('A')))
# print(chr(ord('中')))

# python对bytes类型的数据用自带的b前缀的单引号或双引号来表示
# x = b'ABC'
# print(x)

# unicode表示的字符串通过encode()方法可以编码为bytes
# print('ABC'.encode('ascii'))
# print('ABC'.encode('utf-8'))
# 把byte变为字符串使用decode()方法
# print(b'ABC'.decode('ascii'))
# 转换的bytes中如果只有一小部分无效的字节，可以传入errors='ignore'来忽略错误的字节
# print(b'\xe4\xb8\xad\xff'.decode('utf-8'))
# print(b'\xe4\xb8\xad\xff'.decode('utf-8',errors='ignore'))

# 格式化输出，%d整数 %f浮点数 %s字符串 %x 十六进制数，如果不确定用什么，%s永远起作用，可以把任何数据类型专为字符串
# print('名字叫做%s，年龄是%d' %('徐传良',20))

# 使用list和tuple
# names = ['a' 'b' 'c']
# print(names)
# len()函数可以获取list的元素个数
# print(len(names))
# 使用索引访问，正向索引从0开始
# print(names[0],names[1],names[2])
# 使用-1访问最后一个元素,-2访问倒数第2个元素，以此类推
# print(names[-1])
# 往list末尾追加元素
# names.append('阿弥陀福哦')
# print(names[-1])
# print(len(names))
# 插入元素到指定位置，使用索引
# names.insert(2,'第三个')
# print(names)
# 删除list末尾的元素使用pop()
# names.pop()
# print(names)
# 删除指定位置的元素，使用索引
# names.pop(2)
# print(names)
# 替换元素，直接赋值给定索引的元素即可
# names[1] = '替换'
# print(names)
# list中使用不同类型的元素
# names = ['徐传良',12,12.32,True]
# print(names)
# list元素也可以是另外一个list
# names = ['python','java',['asp','php'],'scheme']

# tuple 是另外一种有序列表，与list非常相似，但是tuple一旦被初始化就不能被修改，不可变的，获取元素的方式和list一致，只不过没有增删改
# name = ('java','php','python')
# print(name[1])

# 条件判断，使用:表示缩进，if elseif else
# age = 16
# if age >= 18:
#     print('你是成年人，年龄是',age)
#     print('游戏结束')
# elif age >= 15:
#     print('你是新的成年人，年龄是',age)
#     print('游戏结束')
# else:
#     print('你是未成年人，年龄是',age)
#     print('游戏结束')
# if可以简写，如果是非零数值、非空字符串、非空list则会判定为true
# if age:
#     print('true')
# else:
#     print('false')
# python使用int()函数完成字符串向数字的转换
# i = input('请输入你的年龄')
# ii = int(i)
# if ii:
#     print('true')
# else:
#     print('false')

# 模式匹配，使用match代替if elif elif elif else
# score = 'F'
# if score == 'A':
#     print('score is A')
# elif score == 'B':
#     print('score is B')
# elif score == 'C':
#     print('score is C')
# elif score == 'D':
#     print('score is D')
# else:
#     print('全班倒数第一')

# 循环，使用for...in循环，依次把list或者tuple中的每个元素迭代出来
# names = ['php', 'java', 'C', 'C++']
# for x in names:
#     print(x)
# sum = 0
# for x in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]:
#     sum = sum + x
# print(sum)
# range()函数可以生成一个序列，list函数可以抓换成list，比如range(5)生成序列从0开始小于5的整数
# print(list(range(5)))
# 循环，使用while循环，只要条件满足就不断循环
# sum = 0
# n = 99
# while n > 0:
#     sum = sum + n
#     n = n - 2
# print(sum)
# break语句用来提前退出循环
# for x in [0,1,2,3,4,5,6,7,8,9]:
#     if x==5:
#         break
#     else:
#         print(x)
# print('输出结束')
# 使用continue跳过本次循环
# for x in [0,1,2,3,4,5,6,7,8,9]:
#     if x==5:
#         continue
#     else:
#         print(x)
# print('输出结束')

# 字典，python内置了字典dict，代表dictionary，在其他语言中也称为map，使用键值对存储，具有极快的查找速度
# d = {'python': 91, 'java': 80, 'php': 12, 'c': 100}
# print(d['python'])
# 使用赋值的方式将键值对存入字典
# d['c++'] = 89
# d['golang'] = 16
# print(d['golang'])
# 直接使用d['xx']的方式获取value时，如果key不存在会报错，要避免报错有两种方式，一种是用in判断key是否存在
# if 'java' in d:
#     print(d['java'])
# 另外一种方式使用get方法，key不存在会返回none或者自己提供的默认值
# print(d.get('java',-1))
# print(d.get('sss',-1))
# 删除key，使用pop(key)方法，对应的value也会删除
# d.pop('java')
# print(d)

# set 和dict类似，是一组key的集合，不能重复，与java中的set类似，要创建一个set，需要提供一个list作为输入集合，set会自动过滤重复的key
# s = set([1, 2, 3, 1])
# 可以通过add方法添加元素到set中，可以通过remove()方法删除元素
# s.add(1)
# s.remove(1)
# set可以看成数学意义上的无语和无重复元素的集合，两个set之间可以直接做交集、并集操作
# s2 = set([4, 3, 5, 7, 8])
# print(s & s2)
# print(s | s2)
# list的排序方法
# l = ['b','a','c']
# l.sort()
# print(l)

# 函数
# 求绝对值的函数abs()
# print(abs(-100))
# 返回最大值的函数max()
# print(max(1,59,23))
# 数据类型转换函数：int() float() str() bool()
# print(bool('true'))
# print(float('1.23'))
# print(int('12'))
# 函数名其实就是指向一个函数对象的引用，完全可以把函数名赋给一个变量，相当于给这个函数名起了一个别名
# a = abs
# print(a(-100))

# 定义函数，Python中，定义一个函数使用def语句，依次写出函数名、括号、括号中的参数和冒号:，然后，在缩进块中编写函数体，函数的返回值使用return语句返回
# def my_abc(x):
#     if x > 0:
#         return x
#     else :
#         return -x
# print(my_abc(-100))
# print(my_abc(100))
# 函数中如果没有return语句，函数执行完毕后也会有返回结果，只是结果为None，return None可以简写为return
# 如果想定义一个什么事情也不做的空函数，可以使用pass语句，pass可以用来当做占位符，比如还没想好怎么写的函数的代码，就可以先放一个pass，让代码能运行起来
# def nop():
#     pass
# 数据类型检查可以使用内置的isinstance()来实现
# def my_abc(x):
#     if not isinstance(x,(int,float)):
#         raise TypeError('bad operand type')
#     if x>0:
#         return x
#     else:
#         return -x
# print(my_abc('a'))
# print(my_abc(10))
# 函数返回多个值，import math表示导入math包，允许后序的代码使用math包中的sin、cos函数
# import math
#
#
# def move(x, y, step, angle=0):
#     nx = x + step * math.cos(angle)
#     ny = y - step * math.sin(angle)
#     return nx, ny
#
# x,y = move(100,100,60,math.pi/6)
# z = move(100,100,60,math.pi/6)
# print(x,y)
# print(z)

# 函数的参数，Python的函数除了可以定义必选参数外，还可以使用默认参数、可变参数和关键字参数
# 函数的必选参数在前，默认参数在后，否则Python的解释器会报错
# 当函数有多个参数时，把变化大的参数放在前面，变化小的参数放在后面，变化小的参数可以作为默认参数
# def power(x, n=2):
#     s = 1
#     while n > 0:
#        n = n-1
#        s = s*x
#     return s
# print(power(5))
# print(power(5,3))
# 当有多个默认参数时，调用的时候，既可以按照顺序提供默认参数，如test('xcl',12,'女')，意思是除了name，gender这两个参数外，最后一个应用参数在gender上，city由于没有提供仍然使用默认值
# 也可以不按照顺序提供部分默认参数，当不按照顺序提供部分默认参数时，需要把参数名字写上，如test('xcl',22,city='北京')，gender由于没有提供值仍然使用的是男，city使用指定值
# def test(name,age,gender='男',city='杭州'):
#     print(name)
#     print(age)
#     print(gender)
#     print(city)
# test('xcl',12)
# test('xcl',12,'女')
# test('xcl',12,'女','北京')
# test('xcl',22,city='北京')
# 默认参数需要指向不变对象